home *** CD-ROM | disk | FTP | other *** search
/ Plug-In Power Pack for Netscape Communicator / Plug-In Power Pack for Netscape Communicator.iso / plugins / dataviews / dvtools / examples / programs / ob_box.c < prev    next >
C/C++ Source or Header  |  1997-05-08  |  12KB  |  365 lines

  1. #ifndef lint
  2. static char SccsId[]= "@(#)ob_box.c    V1.17    3/13/95";
  3. #endif
  4. /*
  5. |    file name - ob_box.c
  6. |===========================================================================
  7. |
  8. |    This program is an example of how the function VOobBox() works.
  9. |    It loads in a view (ob_box.v) that contains different objects.
  10. |    It waits for the user to select and object. It then prints out
  11. |    the coordinates of the "boxes" returned from VOobBox().
  12. |    It also uses these boxes to draw a rectangle object behind the object.
  13. |
  14. |    The program can be exited by typing the letter 'q' or the right
  15. |    mouse button.
  16. |===========================================================================
  17. */
  18. #include <windows.h>
  19. /*
  20.  *  DV-Tools header files
  21.  */
  22. #include "std.h"                /* <stdio.h> etc., scalar & macro definitions */
  23. #include "dvstd.h"              /* public types & constants */
  24. #include "dvtools.h"            /* constants used by T routines */
  25. #include "dvGR.h"               /* constants used by window mgt & GR routines */
  26. #include "VOstd.h"              /* constants used by VO & VOob routines */
  27. #include "Tfundecl.h"           /* T routines (screens, drawports & views) */
  28. #include "VOfundecl.h"          /* VO routines (objects) */
  29. #include "VUerfundecl.h"        /* VUer routines (event handling routines) */
  30.  
  31. /* Constants */
  32. #define  DVPATH            (char *)NULL
  33. #define  DISPFORMS_STB     (char *)NULL
  34. #define  DVDEVICE          (char *)NULL
  35. #define  DVCOLORTABLE      (char *)NULL
  36. #define  VIEW_NAME         "ob_box.v"
  37. #define  SCREEN_VIEWPORT   (RECTANGLE *)NULL
  38. #define  DRAWING_VIEWPORT  (RECTANGLE *)NULL
  39.  
  40. typedef struct
  41. {
  42.   OBJECT rectobj;
  43.   OBJECT ll_ptobj;
  44.   OBJECT ur_ptobj;
  45.   OBJECT msg_obj;
  46. } BOX_INFO;
  47.  
  48. /* Functions defined in ob_box.c */
  49. void DisplayBoundingBox V_P_((OBJECT location, DRAWPORT drawport,
  50.                   BOX_INFO *box));
  51.                   /* display bounding box of selected object */
  52.  
  53. /*
  54.  *   MAIN PROGRAM
  55.  */
  56. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  57.                      LPSTR lpCmdLine,  int nCmdShow  )
  58. {
  59.   INT argc = 0;
  60.   CHAR **argv;
  61.  
  62.   /*
  63.    *  program arguments
  64.    *    argv[1] - display device name (default is to use DVDEVICE)
  65.    */
  66.  
  67.   /* Define & initialize device name and view filename */
  68.   char *device_name = DVDEVICE; /* default device name */
  69.   char *view_name = VIEW_NAME;  /* default view name */
  70.  
  71.   /* Define display variables */
  72.   OBJECT   screen;        /* display device, the window */
  73.   DRAWPORT drawport;      /* how & where to display picture, picture frame */
  74.   VIEW     view;          /* picture representation of the view file */
  75.  
  76.   /* Control loop variables */
  77.   OBJECT     location;    /* the event representation */
  78.  
  79.   /* Other variables */
  80.   OBJECT     drawing;     /* graphical representation of screen */
  81.   BOX_INFO   box;         /* bounding box structure */
  82.   ATTRIBUTES atts;        /* attribute structure */
  83.   int        Quit = NO;   /* flag to quit program */
  84.  
  85.  
  86.   /*--------------------
  87.    *   Initialization
  88.    *
  89.    *   TInit:  perform the initialization of DV-Tools
  90.    *           TInit reads your configuration file and any
  91.    *           environment variables or logical names set.
  92.    */
  93.   make_argv(&argc,&argv,GetCommandLine());
  94.   TInit( DVPATH, DISPFORMS_STB );
  95.  
  96.   /*
  97.    *   TscOpenSet: open a device as a screen object using
  98.    *               specified attributes
  99.    *   TscErase:   erase the entire screen in the default
  100.    *               background color
  101.    *
  102.    *   Set exposure block to YES to insure the window
  103.    *   is ready for drawing when TdpDraw is called.
  104.    */
  105.   if (argc > 1)
  106.     device_name = argv[1];
  107.   screen = TscOpenSet (device_name, DVCOLORTABLE,
  108.                        V_X_EXPOSURE_BLOCK, YES,
  109.                        V_ACTIVE_CURSOR, V_END_OF_LIST);
  110.   if (!screen)
  111.     {
  112.       printf ("Must specify device on command line or");
  113.       printf (" in DataViews configuration file.\n");
  114.       S_EXIT (EXIT_ERR);
  115.     }
  116.   TscErase (screen);
  117.  
  118.   /*
  119.    *   VOscWinEventMask:  sets the screen's window event mask
  120.    */
  121.   VOscWinEventMask ((ULONG) V_KEYPRESS | V_BUTTONPRESS | V_EXPOSE | V_RESIZE,
  122.             (ULONG) 0);
  123.  
  124.   /*
  125.    *   TviLoad:   Load a view in from a file, the view
  126.    *          name is ob_box.v.
  127.    */
  128.   view = TviLoad (view_name);
  129.   if (!view)
  130.     {
  131.       printf ("Could not load view from file ");
  132.       printf ("%s.\n", view_name);
  133.       S_EXIT (EXIT_ERR);
  134.     }
  135.  
  136.   /*
  137.    *   TdpCreate: Create a DV-Tools window, a drawport.
  138.    *              The drawport is attached to the screen object
  139.    *              specified while view specifies the view to be
  140.    *              displayed on the screen.
  141.    */
  142.   drawport = TdpCreate (screen, view, SCREEN_VIEWPORT, DRAWING_VIEWPORT);
  143.  
  144.   /*
  145.    *   TviGetDrawing:     Gets a view's drawing object
  146.    *   TdrGetNamedObject: Gets a named object from a drawing.
  147.    *
  148.    *   Get the message string object from the drawing.
  149.    */
  150.   drawing = TviGetDrawing (view);
  151.   box.msg_obj = TdrGetNamedObject (drawing, "msg_obj");
  152.  
  153.   /*
  154.    *   VOuAtInit:  Sets all attribute fields to EMPTY_FIELD
  155.    *   VOcoCreate: Create a color object
  156.    *   VOptCreate: Create a point object
  157.    *   VOreCreate: Create a rectangle
  158.    *
  159.    *   Create a generic rectangle object which will be moved and
  160.    *   drawn behind each selected object to represent the objects
  161.    *   bounding box.
  162.    */
  163.   VOuAtInit (&atts);
  164.   atts.fill_status = FILLED_OBJECT;
  165.   atts.foreground_color = VOcoCreate (COLOR_NAME, "red");
  166.   box.ll_ptobj = VOptCreate (WORLD_COORDINATES, 0, 0, (OBJECT) NULL);
  167.   box.ur_ptobj = VOptCreate (WORLD_COORDINATES, 0, 0, (OBJECT) NULL);
  168.   box.rectobj = VOreCreate (box.ll_ptobj, box.ur_ptobj, &atts);
  169.  
  170.   /*
  171.    *   TdpDraw:  Draw the contents of the drawport
  172.    */
  173.   TdpDraw (drawport);
  174.  
  175.   /*
  176.    * This loops waiting for the user to pick an object or the 'q' key.
  177.    * If they pick an object, the bounding box for the object is calculated.
  178.    * The world coordinates and the pixel offset_vp is printed.
  179.    * The bounding box is drawn behind the object.
  180.    */
  181.   FOREVER
  182.   {
  183.     /*
  184.      *  VOloWinEventPoll:  Poll for the next window event.
  185.      *                     The polling mode used is V_WAIT.
  186.      *                     Therefore, VOloWinEventPoll does not
  187.      *                     return until a masked event is
  188.      *                     generated.  V_WAIT always produces
  189.      *                     a valid location object.
  190.      */
  191.     location = VOloWinEventPoll (V_WAIT);
  192.  
  193.     /*
  194.      *  VOloType:  returns the type of event.  These types
  195.      *             match event types specified in VOscWinEventMask.
  196.      */
  197.     switch (VOloType (location))
  198.       {
  199.  
  200.       case V_RESIZE:
  201.         /*
  202.          *  The window size has been changed.
  203.          *  TscReset:  Resets all screen drawports after
  204.          *             window resizing
  205.          */
  206.         TscReset (screen);
  207.         break;
  208.  
  209.       case V_EXPOSE:
  210.         /*
  211.          *  VOloRegion:  Returns a rectangle representing the
  212.          *               exposed region on the screen.
  213.          *  TscRedraw:   After erasing, redraws all the drawports
  214.          *               in the screen.
  215.          *  A portion of the window has been exposed and needs
  216.          *  to be redrawn.
  217.          */
  218.         TscRedraw (screen, VOloRegion (location));
  219.         break;
  220.  
  221.       case V_KEYPRESS:
  222.         /*
  223.          *  Check key selected.
  224.          *  VOloKeySym:  Returns the key symbol value of the
  225.          *               location object
  226.          *
  227.          *  If the key symbol represents the characters 'q'
  228.          *  or 'Q' then quit the program.
  229.          */
  230.         switch (VOloKeySym (location))
  231.           {
  232.           case 'q':
  233.           case 'Q':
  234.             Quit = YES;
  235.             break;
  236.  
  237.           default:
  238.             break;
  239.           }
  240.  
  241.       case V_BUTTONPRESS:
  242.         /*
  243.          *  VOloButton:  Returns the button that was pressed
  244.          *
  245.          *  The right mouse button exits the program.
  246.          */
  247.         if (VOloButton (location) == 3)
  248.           Quit = YES;
  249.         else
  250.           DisplayBoundingBox (location, drawport, &box);
  251.         break;
  252.  
  253.       default:
  254.         break;
  255.       }
  256.  
  257.     /* exit the program */
  258.     if (Quit == YES)
  259.       break;
  260.  
  261.   }
  262.  
  263.   /*--------------------
  264.    *   Termination
  265.    *
  266.    *   TdpDestroy:   Destroy the drawport,
  267.    *   TviDestroy:   Destroy the view, freeing the allocated memory
  268.    *   TscCloseCurrentScreen:  Close the current display screen
  269.    *   TTerminate:   Perform the clean-up for DV-Tools
  270.    */
  271.   TdpDestroy (drawport);
  272.   TviDestroy (view);
  273.   TscCloseCurrentScreen ();
  274.   TTerminate ();
  275.   return EXIT_OK;
  276. }
  277.  
  278. void 
  279. DisplayBoundingBox (location, drawport, box)
  280.      OBJECT location;
  281.      DRAWPORT drawport;
  282.      BOX_INFO *box;
  283. {
  284.   OBJECT sel_object;
  285.   RECTANGLE wvp, offset_vp;
  286.   char msg_str[255];
  287.  
  288.   /*
  289.    *   TloGetSelectedObject:  Gets the selected object.
  290.    *
  291.    *   Display a bounding box for the selected object. If
  292.    *   no object was selected then return.
  293.    */
  294.   sel_object = TloGetSelectedObject (location);
  295.   if (sel_object)
  296.     {
  297.       /*
  298.        *   VOobBox:  Get an object's bounding box
  299.        *
  300.        *   Obtain the bounding box for the selected object in world
  301.        *   coordinates.
  302.        */
  303.       VOobBox (sel_object, &wvp, &offset_vp);
  304.  
  305.       /*
  306.        *   Create a message string containing the world coordinate
  307.        *   information of the bounding box. The string will be
  308.        *   displayed by the message text object.
  309.        */
  310.       sprintf (msg_str,
  311.       "world coordinate box = {%ld,%ld,%ld,%ld}\npixel offset_vp = {%ld,%ld,%ld,%ld}",
  312.       wvp.ll.x, wvp.ll.y, wvp.ur.x, wvp.ur.y,
  313.       offset_vp.ll.x, offset_vp.ll.y,
  314.       offset_vp.ur.x, offset_vp.ur.y);
  315.  
  316.       /*
  317.        *   TdpEraseObject:  Erases an object from a drawport
  318.        *   VOtxSetString:   Set the string for the text object
  319.        *   TdpDrawObject:   Draw an object to a drawport
  320.        */
  321.       TdpEraseObject (drawport, box->msg_obj);
  322.       VOtxSetString (box->msg_obj, msg_str);
  323.       TdpDrawObject (drawport, box->msg_obj);
  324.  
  325.       /*
  326.        *   TdpWorldToScreen:  Converts world to screen coordinates
  327.        */
  328.       TdpWorldToScreen (drawport, &wvp.ll, &wvp.ll);
  329.       TdpWorldToScreen (drawport, &wvp.ur, &wvp.ur);
  330.  
  331.       /*
  332.        *   Add the offset which is in screen coordinates to the
  333.        *   converted coordinates (screen).
  334.        */
  335.       wvp.ll.x += offset_vp.ll.x;
  336.       wvp.ll.y += offset_vp.ll.y;
  337.       wvp.ur.x += offset_vp.ur.x;
  338.       wvp.ur.y += offset_vp.ur.y;
  339.  
  340.       /*
  341.        *   TdpScreenToWorld:  Converts screen to world coordinates
  342.        */
  343.       TdpScreenToWorld (drawport, &wvp.ll, &wvp.ll);
  344.       TdpScreenToWorld (drawport, &wvp.ur, &wvp.ur);
  345.  
  346.       /*
  347.        *   VOptMove:  Moves a point object
  348.        *
  349.        *   Move the point objects for the bounding box to a new
  350.        *   position.  The bounding box is moved to an absolute position.
  351.        */
  352.       VOptMove (box->ll_ptobj, DV_ABSOLUTE, (int) wvp.ll.x, (int) wvp.ll.y);
  353.       VOptMove (box->ur_ptobj, DV_ABSOLUTE, (int) wvp.ur.x, (int) wvp.ur.y);
  354.  
  355.       /*
  356.        *   TdpDrawObject:  draw an object to a drawport
  357.        *
  358.        *   Draw the bounding box rectangle object and redraw the
  359.        *   selected object.
  360.        */
  361.       TdpDrawObject (drawport, box->rectobj);
  362.       TdpDrawObject (drawport, sel_object);
  363.     }
  364. }
  365.